iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
AI & Data

[Computer Vision] 電腦視覺下的人臉系列 第 30

[Day 30] 應用三:臉部追蹤

  • 分享至 

  • xImage
  •  

今天就來看一下人臉辨識 + 物件追蹤可以迸出什麼樣的火花吧!

本文開始

  1. applications目錄下新增face_tracking目錄與main.py檔案
  2. 開啟main.py
    import ntpath
    import sys
    
    # resolve module import error in PyCharm
    sys.path.append(ntpath.dirname(ntpath.dirname(ntpath.dirname(ntpath.abspath(__file__)))))
    
    import argparse
    import time
    
    import cv2
    from imutils.video import WebcamVideoStream, FPS
    
    from face_detection.dlib_mmod import detect
    
    # 初始化OpenCV提供的追蹤方法列表
    OPENCV_OBJECT_TRACKERS = {
        # 更準確但比kcf慢
        "csrt": cv2.TrackerCSRT_create,
        # 速度與準確兼備
        "kcf": cv2.TrackerKCF_create,
        "boosting": cv2.TrackerBoosting_create,
        "mil": cv2.TrackerMIL_create,
        "tld": cv2.TrackerTLD_create,
        "medianflow": cv2.TrackerMedianFlow_create,
        # 更快但比kcf不準
        "mosse": cv2.TrackerMOSSE_create
    }
    
    
    def main():
        ap = argparse.ArgumentParser()
        ap.add_argument("-t", "--tracker", type=str,
                        default="kcf",
                        choices=["csrt", "kcf", "boosting", "mil", "tld", "medianflow", "mosse"],
                        help="the object tracker type")
        args = vars(ap.parse_args())
    
        # 初始化object tracker
        trackers = cv2.MultiTracker_create()
    
        # 啟動WebCam
        vs = WebcamVideoStream().start()
        time.sleep(2.0)
        fps = FPS().start()
    
        initFace = False
    
        while True:
            # 取得當前的frame
            frame = vs.read()
    
            # 使用dlib: MMOD來偵測人臉並追蹤
            if not initFace:
                rects = detect(frame)
                for rect in rects:
                    print(rect)
                    tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
                    trackers.add(tracker, frame, rect)
                initFace = True
    
            # 物件追蹤更新
            (_, boxes) = trackers.update(frame)
    
            # 偵測物件位置與畫圖
            if len(boxes) > 0:
                for box in boxes:
                    (x, y, w, h) = [int(b) for b in box]
                    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                fps.update()
                fps.stop()
                cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()), (10, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
    
            cv2.imshow("frame", frame)
    
            key = cv2.waitKey(1) & 0xff
    
            # 你也可以用判斷是否需要圈選物件 (按下c按鍵)
            if key == ord('c'):
                # 圈選矩形框 (需按下空白鍵或Enter確認)
                box = cv2.selectROI("frame", frame, fromCenter=False, showCrosshair=True)
                print(box)
                tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
                trackers.add(tracker, frame, box)
                fps = FPS().start()
            # 按下q鍵就離開程式
            elif key == ord('q'):
                break
    
        vs.stop()
        fps.stop()
        cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        main()
    
    
  3. 開啟terminal,切換到face_tracking目錄下與輸入python main.py

tracking


程式碼部分應該很好理解,

我們把前面的人臉追蹤功能,

cv2.tracker相關的邏輯合併在一起就完成今天的應用了。

你也可以透過按下c按鍵拉矩形範圍與space空白鍵確認,來新增一個tracker追蹤物件

.

.

電腦視覺的世界還有很多問題需要克服,

但到目前也已經有很多的進展,

可以讓我們盡情地去發想各式各樣的應用。

期待你經過這個系列能對這個領域有些些的理解與幫助,

也期待在未來能看到你做出專屬於自己的應用。

系列的原始碼參考


上一篇
[Day 29] 應用三:開發Easy Eye App
系列文
[Computer Vision] 電腦視覺下的人臉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言